"""
使用 memory_profiler 进行内存分析

安装依赖:
pip install memory_profiler psutil

运行内存分析:
python memory_profile_test.py
python -m memory_profiler memory_profile_test.py
"""

from memory_profiler import profile
import time
from string_permutation import (
    permute_recursive,
    permute_iterative,
    permute_lexicographic,
    permute_heap,
    permute_generator
)


@profile
def test_recursive_memory():
    """测试递归方法的内存使用"""
    print("测试递归方法内存使用...")
    test_data = "abcd"  # 4! = 24
    result = permute_recursive(test_data)
    print(f"递归方法生成了 {len(result)} 个排列")
    return result


@profile
def test_iterative_memory():
    """测试迭代方法的内存使用"""
    print("测试迭代方法内存使用...")
    test_data = "abcd"  # 4! = 24
    result = permute_iterative(test_data)
    print(f"迭代方法生成了 {len(result)} 个排列")
    return result


@profile
def test_lexicographic_memory():
    """测试字典序方法的内存使用"""
    print("测试字典序方法内存使用...")
    test_data = "abcd"  # 4! = 24
    result = permute_lexicographic(test_data)
    print(f"字典序方法生成了 {len(result)} 个排列")
    return result


@profile
def test_heap_memory():
    """测试Heap算法的内存使用"""
    print("测试Heap算法内存使用...")
    test_data = "abcd"  # 4! = 24
    result = permute_heap(test_data)
    print(f"Heap算法生成了 {len(result)} 个排列")
    return result


@profile
def test_generator_memory():
    """测试生成器方法的内存使用"""
    print("测试生成器方法内存使用...")
    test_data = "abcd"  # 4! = 24
    result = list(permute_generator(test_data))
    print(f"生成器方法生成了 {len(result)} 个排列")
    return result


@profile
def test_generator_partial_memory():
    """测试生成器方法部分生成的内存使用"""
    print("测试生成器方法部分生成内存使用...")
    test_data = "abcdef"  # 6! = 720
    result = []
    count = 0
    for perm in permute_generator(test_data):
        result.append(perm)
        count += 1
        if count >= 100:  # 只生成前100个
            break
    print(f"生成器方法部分生成了 {len(result)} 个排列")
    return result


@profile
def test_large_data_comparison():
    """测试大数据集的内存比较"""
    print("测试大数据集内存比较...")
    test_data = "abcde"  # 5! = 120
    
    print("1. 迭代方法...")
    iterative_result = permute_iterative(test_data)
    print(f"   迭代方法: {len(iterative_result)} 个排列")
    
    print("2. Heap算法...")
    heap_result = permute_heap(test_data)
    print(f"   Heap算法: {len(heap_result)} 个排列")
    
    print("3. 生成器方法...")
    generator_result = list(permute_generator(test_data))
    print(f"   生成器方法: {len(generator_result)} 个排列")
    
    return iterative_result, heap_result, generator_result


def run_memory_tests():
    """运行所有内存测试"""
    print("=" * 60)
    print("🔍 内存分析测试开始")
    print("=" * 60)
    
    print("\n1. 递归方法内存测试")
    print("-" * 40)
    test_recursive_memory()
    
    time.sleep(1)  # 给系统一点时间清理内存
    
    print("\n2. 迭代方法内存测试")
    print("-" * 40)
    test_iterative_memory()
    
    time.sleep(1)
    
    print("\n3. 字典序方法内存测试")
    print("-" * 40)
    test_lexicographic_memory()
    
    time.sleep(1)
    
    print("\n4. Heap算法内存测试")
    print("-" * 40)
    test_heap_memory()
    
    time.sleep(1)
    
    print("\n5. 生成器方法内存测试")
    print("-" * 40)
    test_generator_memory()
    
    time.sleep(1)
    
    print("\n6. 生成器部分生成内存测试")
    print("-" * 40)
    test_generator_partial_memory()
    
    time.sleep(1)
    
    print("\n7. 大数据集内存比较")
    print("-" * 40)
    test_large_data_comparison()
    
    print("\n" + "=" * 60)
    print("🎉 内存分析测试完成")
    print("=" * 60)
    print("\n📊 使用说明:")
    print("- Line #: 行号")
    print("- Mem usage: 当前内存使用量")
    print("- Increment: 相对于前一行的内存增量")
    print("- Line Contents: 代码内容")
    print("\n💡 提示:")
    print("- 负的增量表示内存被释放")
    print("- 注意观察各算法的峰值内存使用")
    print("- 生成器方法应该显示更低的内存使用")


if __name__ == "__main__":
    run_memory_tests()
